/**
 * 
 */
package org.statewalker.parser.wiki.grammar;

import org.statewalker.tokenizer.text.TextDict;
import org.statewalker.validator.AbstractGrammar;
import org.statewalker.validator.ValidatorGrammarConfig;

/**
 * @author kotelnikov
 */
public class WikiInlineGrammar extends AbstractGrammar {

    public WikiInlineGrammar(ValidatorGrammarConfig config) {
        this(config, WikiBlockDict.P);
    }

    public WikiInlineGrammar(ValidatorGrammarConfig config, String root) {
        super(config, root);
    }

    protected String getParent() {
        return WikiInlineDict.STYLE;
    }

    protected String getStyleContainer() {
        return getROOT();
    }

    @Override
    public void init() {
        // Styles
        initSTYLE();
        // Inlines
        initA();
        initBR();
        initESC();
        initIMG();
        initPCDATA();
    }

    protected void initA() {
        init(WikiInlineDict.A);
        defineParent(WikiInlineDict.A, getParent());
        defineSubstates(
            WikiInlineDict.A,
            WikiInlineDict.PCDATA,
            WikiInlineDict.IMG);
    }

    protected void initBR() {
        init(WikiInlineDict.BR);
        defineParent(WikiInlineDict.BR, getParent());
    }

    protected void initESC() {
        init(WikiInlineDict.ESC);
        defineParent(WikiInlineDict.ESC, getParent());
    }

    protected void initIMG() {
        init(WikiInlineDict.IMG);
        defineParent(WikiInlineDict.IMG, getParent());
    }

    protected void initPCDATA() {
        init(WikiInlineDict.PCDATA);
        defineParent(WikiInlineDict.PCDATA, getParent());
        for (String key : TextDict._ALL) {
            defineParent(key, WikiInlineDict.PCDATA);
        }
        defineSubstates(
            WikiInlineDict.PCDATA,
            TextDict.SPECIAL,
            TextDict.SPACES,
            TextDict.WORD,
            TextDict.EOL);

    }

    protected void initSTYLE() {
        init(WikiInlineDict.STYLE);
        defineParent(WikiInlineDict.STYLE, getStyleContainer());
        defineSubstates(WikiInlineDict.STYLE, WikiInlineDict.PCDATA);
        defineSubstates(WikiInlineDict.STYLE, WikiInlineDict.A);
        defineSubstates(WikiInlineDict.STYLE, WikiInlineDict.BR);
        defineSubstates(WikiInlineDict.STYLE, WikiInlineDict.IMG);
    }

}